/*----------------------------------------------------------------------------
 * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright notice, this list of
 * conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
 * of conditions and the following disclaimer in the documentation and/or other materials
 * provided with the distribution.
 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
 * to endorse or promote products derived from this software without specific prior written
 * permission.
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *---------------------------------------------------------------------------*/
 /*----------------------------------------------------------------------------
 * Notice of Export Control Law
 * ===============================================
 * Huawei LiteOS may be subject to applicable export control laws and regulations, which might
 * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.
 * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such
 * applicable export control laws and regulations.
 *---------------------------------------------------------------------------*/

#include "los_hwi.h"
#include "los_typedef.h"
#include "los_api_interrupt.h"
#include "los_inspect_entry.h"
#include "csg_sdk_hal.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cpluscplus */
#endif /* __cpluscplus */

#if (LOSCFG_PLATFORM_HWI == YES)
extern UINT32 TempData1;
static VOID Example_Exti0_Init(VOID)
{
    /*add your IRQ init code here*/
    iomux_ls_iof_ival_cfg(IOMUX_BASE,LGPIO_IO_PORT_PINS_0_IOF_IVAL,40,LGPIO_IO_PORT_PINS_0_HS_SEL,0,0);
    LGPIO_Input_Enable(LGPIO,1<<0);
    return;
}

static VOID LGPIO_GPIO_IRQ_0_IRQHandler(VOID)
{
    UINT32 uwRet;
    
    dprintf("\r\n3. IRQ entry success!\r\n");
    LGPIO_ITClear(LGPIO,LGPIO_PinSource0,LGPIO_IT_RISE);
    // if(TempData1==0xAA)
    // {
    //     uwRet = LOS_HwiDelete(LGPIO_GPIO_IRQ_0_IRQn);
    //     if(uwRet != LOS_OK)
    //     {
    //         dprintf("\r\n4. LOS_HwiDelete failed .\r\n");
    //         return LOS_NOK;
    //     }
    //     else
    //     {
    //         dprintf("\r\n4. LOS_HwiDelete success!\r\n");
    //     }
    //     LOS_InspectStatusSetByID(LOS_INSPECT_INTERRUPT,LOS_INSPECT_STU_SUCCESS);
    // }

    return;
}

UINT32 Example_InterruptCreate(VOID)
{
    UINTPTR uvIntSave;
    UINT32 uwRet;
    dprintf("\r\n--------4.8 Interrupt create test start!--------\r\n");
    uvIntSave = LOS_IntLock();
    TempData1=0;
    Example_Exti0_Init();
    dprintf("\r\n1. GPIO init success!\r\n");
    
    uwRet = LOS_HwiCreate(LGPIO_GPIO_IRQ_0_IRQn, 1, ECLIC_NON_VECTOR_INTERRUPT, LGPIO_GPIO_IRQ_0_IRQHandler, ECLIC_LEVEL_TRIGGER);
    if(uwRet != LOS_OK)
    {
        dprintf("\r\nLOS_HwiCreate failed .\r\n");
        return LOS_NOK;
    }
    dprintf("\r\n2. LOS_HwiCreate success!\r\n");
    LGPIO_ITConfig(LGPIO,LGPIO_PinSource0,LGPIO_IT_RISE,ENABLE);
    __enable_irq();
    LOS_IntRestore(uvIntSave);
    while(1)
    {
        TempData1=(USART0->RXDATA);
        if(TempData1& USART_RXDATA_EMPTY)
        {
            TempData1=0;
        }
        else
        {
            TempData1=(TempData1 & 0xFF);
        }
        // TempData1=((USART0->RXDATA)& 0xFF);
        // delay_1ms(1000);
        if(TempData1==0x55)
        {
            uwRet = LOS_HwiDelete(LGPIO_GPIO_IRQ_0_IRQn);
            if(uwRet != LOS_OK)
            {
                dprintf("\r\n4. LOS_HwiDelete failed .\r\n");
                return LOS_NOK;
            }
            else
            {
                dprintf("\r\n4. LOS_HwiDelete success!\r\n");
            }
            TempData1=0;
            // __disable_irq();
            LOS_InspectStatusSetByID(LOS_INSPECT_INTERRUPT,LOS_INSPECT_STU_SUCCESS);
            return LOS_OK;
        }
    }
    return LOS_OK;
}
#endif

#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cpluscplus */
#endif /* __cpluscplus */
